/**
 * 通用工具函数模块
 */

class ExtensionUtils {
  /**
   * 检查扩展上下文是否仍然有效
   * @returns {boolean} 扩展上下文是否有效
   */
  static isContextValid() {
    try {
      return typeof chrome !== 'undefined' && chrome.runtime && !chrome.runtime.lastError;
    } catch (e) {
      return false;
    }
  }

  /**
   * 安全地执行Chrome API调用
   * @param {Function} apiCall - 要执行的API调用函数
   * @param {Function} callback - 回调函数
   */
  static safeApiCall(apiCall, callback) {
    if (!this.isContextValid()) {
      if (callback) callback(new Error('扩展上下文已失效'));
      return;
    }

    try {
      apiCall((result) => {
        if (!this.isContextValid()) {
          if (callback) callback(new Error('扩展上下文已失效'));
          return;
        }

        if (chrome.runtime.lastError) {
          if (callback) callback(new Error(chrome.runtime.lastError.message));
        } else {
          if (callback) callback(null, result);
        }
      });
    } catch (e) {
      if (this.isContextValid()) {
        if (callback) callback(e);
      } else {
        if (callback) callback(new Error('扩展上下文已失效'));
      }
    }
  }

  /**
   * 保存数据到本地存储
   * @param {Object} data - 要保存的数据
   * @returns {Promise<void>}
   */
  static saveToStorage(data) {
    return new Promise((resolve, reject) => {
      this.safeApiCall(
        (cb) => chrome.storage.local.set(data, cb),
        (error) => {
          if (error) {
            reject(error);
          } else {
            resolve();
          }
        }
      );
    });
  }

  /**
   * 从本地存储获取数据
   * @param {Array|string} keys - 要获取的键
   * @returns {Promise<Object>}
   */
  static loadFromStorage(keys) {
    return new Promise((resolve, reject) => {
      this.safeApiCall(
        (cb) => chrome.storage.local.get(keys, cb),
        (error, result) => {
          if (error) {
            reject(error);
          } else {
            resolve(result);
          }
        }
      );
    });
  }
}

// 导出工具类
if (typeof module !== 'undefined' && module.exports) {
  module.exports = ExtensionUtils;
} else {
  window.ExtensionUtils = ExtensionUtils;
}